軟件開發(fā)是一個(gè)每年都在發(fā)展的過(guò)程,但業(yè)界很少有東西像 Docker 這樣成為標(biāo)準(zhǔn)。自 2013 年公開發(fā)布以來(lái),Docker 一直用于開發(fā)、交付和運(yùn)行應(yīng)用程序。時(shí)至今日,它仍是許多經(jīng)驗(yàn)豐富的開發(fā)人員使用的軟件開發(fā)的重要組成部分。在本文中,我們將介紹 Docker 到底是什么、使用它的優(yōu)缺點(diǎn)以及它的實(shí)際工作原理。
什么是Docker?
Docker是一個(gè)開源容器化平臺(tái),可獨(dú)立于本地或主機(jī)基礎(chǔ)設(shè)施開發(fā)、運(yùn)送和運(yùn)行應(yīng)用程序。它是一個(gè)創(chuàng)建和管理容器的平臺(tái),這些容器彼此隔離但可以通過(guò)定義的通道相互通信。Docker 之所以成為流行的 PaaS,是因?yàn)槿萜鞯母拍睿萜魇褂玫馁Y源比 VM 少。
什么是容器,它們解決什么問(wèn)題?
在詳細(xì)說(shuō)明 Docker 的功能之前,讓我們先了解它的組件。所有應(yīng)用程序和程序都是為在特定環(huán)境中運(yùn)行而開發(fā)的。這些環(huán)境要么具有應(yīng)用程序所需的庫(kù)或工具,要么運(yùn)行應(yīng)用程序兼容運(yùn)行的軟件版本。
容器就是這樣的環(huán)境,包括應(yīng)用程序運(yùn)行的所有庫(kù)和工具。容器的作用是將這些應(yīng)用程序與應(yīng)用程序的庫(kù)和工具一起打包在容器中,這樣它就可以在任何地方運(yùn)行,而不必依賴宿主的環(huán)境。
這是一個(gè)簡(jiǎn)單的類比:
宜家出售需要自行組裝的家具。但是,他們?cè)趺粗浪锌蛻舳加薪M裝家具的工具呢?他們沒(méi)有。宜家將工具與家具一起運(yùn)送,因此世界各地的任何客戶都可以在宜家包裹到達(dá)他們家門口的那一刻就開始安裝。
這基本上就是容器的工作方式,使開發(fā)和交付軟件更加容易。通過(guò)在容器環(huán)境中包含所有必要的工具,開發(fā)人員不必再擔(dān)心與不同服務(wù)器或主機(jī)的不兼容問(wèn)題。另一個(gè)經(jīng)常與容器一起出現(xiàn)的術(shù)語(yǔ)是微服務(wù)。
Docker 做什么?
Docker 只是一個(gè)管理這些容器的平臺(tái),因此您可以輕松構(gòu)建不同的特定環(huán)境。Docker 平臺(tái)讓開發(fā)人員和程序員可以在整個(gè)工作空間中無(wú)縫地使用容器。無(wú)論您是內(nèi)部團(tuán)隊(duì)還是成員遍布世界各地的遠(yuǎn)程團(tuán)隊(duì),使用 Docker 來(lái)運(yùn)送和運(yùn)行容器都是一種更高效地構(gòu)建軟件的低成本方式。?但是除了方便之外,使用 Docker 還有很多好處。我們將在本文后面詳細(xì)討論容器化如何更快、更安全并且更適合擴(kuò)展。
Docker解決了什么?
Docker 解決了自己創(chuàng)建容器并在整個(gè)團(tuán)隊(duì)中管理它們的問(wèn)題。當(dāng)您想要優(yōu)化開發(fā)過(guò)程的工作流程時(shí),這一點(diǎn)變得尤為重要。
使用 Docker 的優(yōu)缺點(diǎn)
除了管理方面,Docker 還解決了許多其他復(fù)雜、艱巨的問(wèn)題。
以下是使用 Docker 的主要優(yōu)勢(shì)
- 可靠性。使用 Docker 進(jìn)行容器化可確保您的應(yīng)用幾乎可以在安裝了 Docker 的任何地方運(yùn)行。您不必?fù)?dān)心版本不兼容或手動(dòng)安裝依賴項(xiàng)。
- 效率。軟件開發(fā)的一個(gè)巨大瓶頸是當(dāng)應(yīng)用程序或軟件在沒(méi)有環(huán)境的情況下在計(jì)算機(jī)中崩潰時(shí)。通過(guò)使用容器,您可以擺脫這些瓶頸并簡(jiǎn)化工作流程以專注于開發(fā)軟件,而不會(huì)因安裝依賴項(xiàng)而分心。
- 可擴(kuò)展性。可以選擇快速創(chuàng)建新容器并部署它們可以更快地為您的軟件打補(bǔ)丁或更新。與通常意味著構(gòu)建到現(xiàn)有代碼然后重新啟動(dòng)它以更新程序的整體式編程不同,容器讓您可以獨(dú)立地在彼此之上構(gòu)建。這意味著您可以在不損壞其他容器及其功能的情況下添加和刪除容器,從而更輕松地?cái)U(kuò)展您的軟件。
- 無(wú)障礙。使用容器,軟件維護(hù)的例行檢查和優(yōu)化過(guò)程也更容易。由于容器彼此獨(dú)立工作,您可以配置、更新和部署容器,而無(wú)需關(guān)閉或干擾其他容器。這使得容器易于訪問(wèn)。
- 輕的。容器是需要操作系統(tǒng)才能運(yùn)行的虛擬機(jī)的輕量級(jí)替代方案。容器通過(guò)共享主機(jī)的資源(如 RAM 和 CPU)而不是需要專用資源(即使未使用)的虛擬機(jī)來(lái)避免這樣做。
- 版本自由。由于容器彼此隔離,您可以使用最新版本的 JavaScript 運(yùn)行一個(gè)容器,而另一個(gè)容器運(yùn)行舊版本。每種語(yǔ)言都沒(méi)有完美的版本,程序員對(duì)某些版本比其他版本更熟悉。通過(guò)容器在不破壞其他代碼行的情況下?lián)碛惺褂萌魏伟姹镜膭?chuàng)造性自由,使您的軟件更加通用。
沒(méi)有什么是完美的,Docker 也遠(yuǎn)非萬(wàn)能的一站式解決方案。該平臺(tái)確實(shí)有其自身應(yīng)注意的缺點(diǎn)。
使用 Docker 的缺點(diǎn)
- 陡峭的學(xué)習(xí)曲線。盡管 Docker 方便快捷,但不可否認(rèn)要精通該平臺(tái)需要一定的學(xué)習(xí)曲線。您不會(huì)在一夜之間成為使用 Docker 的高手,您可以預(yù)期您的團(tuán)隊(duì)成員也會(huì)遇到同樣的困難。如果您需要對(duì) Docker 引擎進(jìn)行維護(hù)或定制,您還必須了解 Linux。
- 平臺(tái)到平臺(tái)的通信。盡管容器可以無(wú)縫地相互對(duì)話,但在這個(gè)領(lǐng)域工作的公司并不總是意見一致。競(jìng)爭(zhēng)對(duì)手的集裝箱公司并不經(jīng)常相互合作,如果您想擴(kuò)展您正在使用的技術(shù),這可能會(huì)破壞交易。
- 臨時(shí)容器。一旦容器的使用結(jié)束,例如當(dāng)它完成一個(gè)進(jìn)程并且不再使用時(shí),容器將與其處理的所有數(shù)據(jù)一起關(guān)閉。除非您使用卷將數(shù)據(jù)存儲(chǔ)到 Docker 引擎,否則不會(huì)保存數(shù)據(jù)。這不一定是壞事,但對(duì)于您的軟件開發(fā)過(guò)程來(lái)說(shuō)卻是值得注意的事情。Docker 對(duì)此還沒(méi)有自動(dòng)化的解決方案。
- 命令行界面。Docker 的界面類似于命令行,這使其成為運(yùn)行需要圖形界面的應(yīng)用程序的糟糕選擇。它主要針對(duì)通過(guò)終端上的命令運(yùn)行的應(yīng)用程序和程序進(jìn)行了優(yōu)化。
最后,新公司在使用 Docker 時(shí)面臨的一個(gè)常見問(wèn)題是,他們?cè)诓涣私馊绾问紫仍O(shè)計(jì)和編排開發(fā)架構(gòu)的情況下嘗試使用它。Docker 并不是一個(gè)放之四海而皆準(zhǔn)的平臺(tái),有些程序沒(méi)有它會(huì)更好。
Docker 是如何工作的
Docker 在客戶端-服務(wù)器的基礎(chǔ)上工作。您所看到的 Docker 客戶端與負(fù)責(zé)執(zhí)行和管理任務(wù)的 Docker 守護(hù)進(jìn)程對(duì)話。
Docker的核心組件和架構(gòu)
除此之外,還有更多來(lái)自 Docker 的功能,它們可以提供不同的功能。今天,我們只關(guān)注 Docker 的四個(gè)核心組件。
Docker客戶端
Docker 客戶端是您與 Docker 守護(hù)進(jìn)程之間的接口。這是您輸入命令、運(yùn)行程序以及主要與 Docker 交互的地方。
碼頭守護(hù)進(jìn)程
守護(hù)進(jìn)程負(fù)責(zé)管理 Docker 平臺(tái)上的所有內(nèi)容,無(wú)論是映像、容器、卷還是網(wǎng)絡(luò)。簡(jiǎn)單來(lái)說(shuō),這是您整個(gè) Docker 操作背后的策劃者。您通過(guò)客戶端發(fā)送的所有命令都由守護(hù)程序處理并由其管理。守護(hù)進(jìn)程也可以與來(lái)自其他服務(wù)器的守護(hù)進(jìn)程連接。
Docker登記處
Docker 注冊(cè)表是一個(gè)開源系統(tǒng),您可以在其中存儲(chǔ)和下載 Docker 映像。您甚至可以在與同事共享的工作區(qū)中設(shè)置私人注冊(cè)表。
Docker圖像
Docker 鏡像是只讀文件,其中包含創(chuàng)建 Docker 容器的說(shuō)明。簡(jiǎn)單來(lái)說(shuō),它就像一個(gè)藍(lán)圖,告訴 Docker 守護(hù)進(jìn)程運(yùn)行什么環(huán)境。這是使容器創(chuàng)建變得更容易和更快的部分原因。結(jié)合 Docker 注冊(cè)表,您可以找到公開可用的圖像預(yù)設(shè),甚至可以為您的同事創(chuàng)建自定義圖像供您的同事使用。
Docker 或 Kubernetes
Docker 和容器化的新手經(jīng)常問(wèn)的一個(gè)問(wèn)題是“Docker 和 Kubernetes 哪個(gè)更好?”答案非常簡(jiǎn)單:兩者都有。
什么是 Kubernetes?
Kubernetes是谷歌開發(fā)的用于管理部署自動(dòng)化和容器化服務(wù)的系統(tǒng)。它旨在處理和管理成百上千的容器,并優(yōu)化這些容器之間的協(xié)作方式。Kubernetes 通過(guò)為特殊功能構(gòu)建的節(jié)點(diǎn)來(lái)實(shí)現(xiàn)這一點(diǎn)。
這些節(jié)點(diǎn)可以分為兩類:主力節(jié)點(diǎn)和頭節(jié)點(diǎn)。主力節(jié)點(diǎn)負(fù)責(zé)任何計(jì)算并完成所有繁重的工作。這需要比頭節(jié)點(diǎn)更多的資源。另一方面,頭節(jié)點(diǎn)負(fù)責(zé)分配任務(wù)和接收最終輸出。?簡(jiǎn)而言之,Kubernetes 是用來(lái)管理和優(yōu)化容器之間的整個(gè)工作流程的,這與 Docker 有很大的不同。
Docker 和 Kubernetes 有什么區(qū)別?
Docker 是一個(gè)構(gòu)建、運(yùn)送和運(yùn)行容器的容器化平臺(tái)。它是一個(gè)平臺(tái),可讓您像部署容器一樣輕松地構(gòu)建容器。相比之下,Kubernetes 更注重容器管理和效率。它處理大量容器并優(yōu)化它們以通過(guò)節(jié)點(diǎn)更快地工作。
行動(dòng)后報(bào)告——你應(yīng)該使用 Docker 嗎?
那么,你應(yīng)該為你的軟件使用 Docker 嗎?這得看情況。如果您需要經(jīng)常移植您的環(huán)境,Docker 通常會(huì)對(duì)您的開發(fā)過(guò)程產(chǎn)生最大的影響。使用 Docker 的下一個(gè)最大考慮因素是,如果您正在與必須不斷來(lái)回測(cè)試您的應(yīng)用程序的大型團(tuán)隊(duì)合作。在需要在不同計(jì)算機(jī)上運(yùn)行應(yīng)用程序的開發(fā)人員和運(yùn)營(yíng)經(jīng)理之間工作的團(tuán)隊(duì)會(huì)發(fā)現(xiàn) Docker 是救星。